<?php
namespace App\Http\Middleware\Awstats\Visit\Trade;

use Closure;
use App\Core\Entity\Awstats\VisitEntity;
use App\Models\Trade\Supply\SupplyCountVisitModel;

/**
 * 访问统计，主要为 pv, uv
 */
class Supply
{

    const KEY_NAME = 'supply';

    /**
     * 访问统计实体
     *
     * @var \App\Core\Entity\Awstats\VisitEntity
     */
    protected $visit;

    /**
     * 执行状态
     *
     * @var boolean
     */
    protected $exeStatus = false;

    /**
     * 初始化访问统计实体
     *
     * @param VisitEntity $visit            
     */
    public function __construct(VisitEntity $visit)
    {
        $this->visit = $visit;
    }

    /**
     * 前置 | 后置
     *
     * @param \Illuminate\Http\Request $request            
     * @param \Closure $next            
     * @return \Closure $next
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        
        // 获取参数
        $id = $request->query('id');
        
        // 初始化 uv 数据
        $this->visit->initUv(self::KEY_NAME, $id);
        
        // 标记执行状态
        $this->exeStatus = true;
        
        return $response;
    }

    /**
     * 响应发送到浏览器之后处理
     *
     * @param \Illuminate\Http\Request $request            
     * @param \Illuminate\Http\Response $response            
     */
    public function terminate($request, $response)
    {
        // 判断执行状态
        if (! $this->exeStatus) {
            return false;
        }
        
        // 获取参数
        $id = $request->query('id');
        
        // pv +1
        SupplyCountVisitModel::incPv($id);
        
        // uv +1
        $status = $this->visit->hasUv(self::KEY_NAME, $id);
        if (! $status) {
            SupplyCountVisitModel::incUv($id);
        }
    }
}